/**
 * 通用日志工具，解决Windows下中文乱码问题
 */
const iconv = require('iconv-lite');

class Logger {
  /**
   * 输出普通信息日志
   */
  static log() {
    this._log('log', arguments);
  }

  /**
   * 输出警告日志
   */
  static warn() {
    this._log('warn', arguments);
  }

  /**
   * 输出错误日志
   */
  static error() {
    this._log('error', arguments);
  }

  /**
   * 输出调试日志
   */
  static debug() {
    this._log('debug', arguments);
  }

  /**
   * 日志输出核心方法
   * @private
   */
  static _log(level, args) {
    // 格式化日志参数
    const formattedArgs = Array.from(args).map(arg => {
      if (arg === null) return 'null';
      if (arg === undefined) return 'undefined';
      if (typeof arg === 'object' || typeof arg === 'function') {
        try {
          return JSON.stringify(arg, null, 2);
        } catch (e) {
          return String(arg);
        }
      }
      return String(arg);
    });

    // 构建完整日志消息
    const timestamp = new Date().toLocaleString('zh-CN', {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit',
      hour12: false
    });

    const message = `[${timestamp}] [${level.toUpperCase()}] ${formattedArgs.join(' ')}`;

    // Windows平台中文乱码处理
    if (process.platform === 'win32') {
      try {
        // 尝试直接输出UTF-8
        console[level](message);
      } catch (e) {
        try {
          // 尝试使用iconv-lite转换为cp936编码
          const buffer = iconv.encode(message, 'cp936');
          process.stdout.write(buffer);
          process.stdout.write('\n');
        } catch (e2) {
          // 双重失败，直接使用console输出
          console[level](message);
        }
      }
    } else {
      // 非Windows平台直接输出
      if (level === 'error' || level === 'warn') {
        console[level](message);
      } else {
        console.log(message);
      }
    }
  }

  /**
   * 替换全局console对象
   */
  static replaceGlobalConsole() {
    console.originalLog = console.log;
    console.originalWarn = console.warn;
    console.originalError = console.error;
    console.originalDebug = console.debug || console.log;

    console.log = function() {
      Logger.log.apply(Logger, arguments);
    };

    console.warn = function() {
      Logger.warn.apply(Logger, arguments);
    };

    console.error = function() {
      Logger.error.apply(Logger, arguments);
    };

    console.debug = function() {
      Logger.debug.apply(Logger, arguments);
    };
  }

  /**
   * 恢复全局console对象
   */
  static restoreGlobalConsole() {
    if (console.originalLog) {
      console.log = console.originalLog;
      console.warn = console.originalWarn;
      console.error = console.originalError;
      console.debug = console.originalDebug;
    }
  }
}

// CommonJS导出
module.exports = Logger;
// 为ES模块添加default导出支持
module.exports.default = Logger;